// Copyright (C) 2011  Andrew H. Chan
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

#ifndef _FINDMEDIAN_H__
#define _FINDMEDIAN_H__

typedef unsigned long long uint64;

inline uint64 findMedian5(uint64 a, uint64 b, uint64 c, uint64 d, uint64 e) {
    if(a > b) { // a > b
        if(a > c) { // a > c
            if(a > d) { // a > d
                if(a > e) { // a, ...
                    if(b > c) {
                        if(b > d) {
                            if(b > e) { // a, b, ...
                                if(c > d) {
                                    if(c > e) { // a, b, c, ...
                                        return c;
                                    } else { // a, b, e, ...
                                        return e;
                                    }
                                } else { // d > c
                                    if(d > e) { // a, b, d, ...
                                        return d;
                                    } else { //  e > d; a, b, e, ...
                                        return e;
                                    }
                                }
                            } else { // e > b > d and e > b > c; a, e, b, ...
                                return b;
                            }
                        } else { // d > b > c;
                            if(b > e) { // d > b > e and d > b > c; a, d, b, ...
                                return b;
                            } else { // e > b > c and d > b > c;
                                if(d > e) { // d > e > b > c; a, d, e, b, c
                                    return e;
                                } else { // e > d; e > d > b > c; a, e, d, b, c
                                    return d;
                                }
                            }
                        }
                    } else { // c > b
                        if(c > d) {
                            if(c > e) { // a, c, ...
                                if(b > d) {
                                    if(b > e) { // a, c, b, ...
                                        return b;
                                    } else { // e > b > d; a, c, e, b, d
                                        return e;
                                    }
                                } else { // d > b
                                    if(d > e) { // a, c, d, ...
                                        return d;
                                    } else { // e > d > b; a, c, e, d, b
                                        return e;
                                    }
                                }
                            } else { // e > c > b and e > c > d; a, e, c, ...
                                return c; 
                            }
                        } else { // d > c > b
                            if(c > e) { // d > c > b and d > c > e; a, d, c, ...
                                return c;
                            } else { // e > c > b 
                                if(d > e) { // d > e > c > b; a, d, e, c, b
                                    return e;
                                } else { // e > d > c > b; a, e, d, c, b
                                    return d;
                                }
                            }
                        }
                    }
                } else { // e > a > b and e > a > c and e > a > d; e, a, ...
                    if(b > c) { // b > c and e > a > b > c
                        if(b > d) { // b > d and e > a > b > c and e > a > b > d; e, a, b, ...
                            return b;
                        } else { // d > b and e > a > b > c and e > a > d > b > c; e, a, d, b, c
                            return d;
                        }
                    } else { // c > b and e > a > c > b and e > a > d;
                        if(b > d) { // b > d and e > a > c > b > d; e, a, c, b, d
                            return c;
                        } else { // d > b and e > a > c > b 
                            if(c > d) { // e > a > c > d > b ; e, a, c, d, b
                                return c;
                            } else { // d > c and e > a > d > c > b; e, a, d, c, b 
                                return d;
                            }
                        }
                    }
                }
            } else { // d > a and d > a > b and d > a > c
                if(a > e) { // d > a > e and d > a > b and d > a > c; d, a, ...
                    if(c > b) { // d > a > c > b and d > a > e
                        if(c > e) { // d > a > c > b and d > a > c > e; d, a, c, ...
                            return c;
                        } else { // e > c and d > a > e > c > b; d, a, e, c, b
                            return e;
                        }
                    } else { // b > c and d > a > b > c
                        if(b > e) { // d > a > b > c and d > a > b > e; d, a, b, ...
                            return b;
                        } else { // e > b and d > a > e > b > c; d, a, e, b, c
                            return e;
                        }
                    }
                } else { // e > a and d > a and a > b and a > c
                    return a;
                }
            }
        } else { // c > a > b
            if(b > d) { // c > a > b > d
                if(b > e) { // c > a > b > d and c > a > b > e; c, a, b, ...
                    return b;
                } else { // e > b and c > a > b > d
                    if(a > e) {  // a > e and c > a > e > b > d; c, a, e, b, d
                        return e;
                    } else { // e > a and e > a > b > d and c > a > b > d
                        return a;
                    }
                }
            } else { // d > b and c > a > b
                if(d > a) { // c > a and d > a and a > b 
                    if(a > e) { // c > a and d > a and a > b and a > e
                        return a;
                    } else { // e > a and c > a and and d > a > b
                        if(c > d) { // c > d > a > b
                            if(d > e) { // c > d > e > a > b
                                return e;
                            } else { // e > d and d > a > b and e > d and c > d
                                return d;
                            }
                        } else { // d > c and d > c > a > b
                            if(e > d) { // e > d > c > a > b
                                return c;
                            } else { // d > e and d > c > a > b
                                if(c > e) { // d > c > e > a > b
                                    return e;
                                } else { // e > c and d > e > c > a > b
                                    return c;
                                }
                            }
                        }
                    }
                } else { // a > d and c > a > d > b
                    if(e > c) { // e > c > a > d > b
                        return a;
                    } else { // c > e and c > a > d > b
                        if(e > a) { // c > e > a > d > b
                            return a;
                        } else { // a > e and c > a > d > b and c > a > e; c, a, ...
                            if(e > d) { // c > a > e > d > b
                                return e;
                            } else { // d > e and d > b and c > a > d
                                return d;
                            }
                        }
                    }
                }
            }
        }
    } else { // b > a
        if(c > b) { // c > b > a 
            if(d > c) { // d > c > b > a
                if(e > d) { // e > d > c > b > a
                    return c;
                } else { // d > e and d > c > b > a
                    if(c > e) { // d > c > b > a and c > e 
                        if(e > b) { // d > c > e > b > a
                            return e;
                        } else { // b > e and d > c > b > a and c > e
                            return b;
                        }
                    } else { // e > c and d > c > b > a
                        return c;
                    }
                }
            } else { // c > d and c > b > a
                if(a > d) { // c > b > a > d
                    if(d > e) { // c > b > a > d > e
                        return a;
                        //} else { // e > d and c > b > a > d
                        //    if(e > c) { // e > c > b > a > d
                        //        return b;
                        //    } else { // c > e and e > d and c > b > a > d
                        //        if(e > b) { // c > e and e > b and b > a > d
                        //            return b;
                        //        } else { // b > e and c > b > e > d and c > b > a > d
                        //            if(a > e) { // c > b > a > e > d
                        //                return a;
                        //            } else { // e > a and c > b > e > a > d
                        //                return e;
                        //            }
                        //        }
                        //    }
                } else { // e > d and c > b > a > d
                    if(b > e) // b > e > d and c > b > a > d
                        if(a > e) { //  c > b > a > e > d
                            return a;
                        } else { // e > a and c > b > e > a > d
                            return e;
                        }
                        else { // e > b and c > b > a > d
                            return b;
                        }
                }
                } else { // d > a and c > b > a and c > d > a
                    if(b > d) { // c > b > d > a
                        if(d > e) { // c > b > d > a and d > e
                            return d;
                        } else { // e > d and c > b > d > a
                            if(b > e) { // c > b > e > d > a
                                return  e;
                            } else { // e > b and c > b > d > a
                                return b;
                            }
                        }
                    } else { // d > b and c > d > b > a
                        if(e > c) { // e > c > d > b > a
                            return d;
                        } else { // c > e and c > d > b > a
                            if(b > e) { // c > d > b > e and c > d > b > a
                                return b;
                            } else { // e > b and c > d > b > a
                                if(d > e) { // c > d > e > b > a
                                    return e;
                                } else { // e > d and c > d > b > a
                                    return d;
                                }
                            }
                        }
                    }
                }
            }
        } else { // b > c and b > a
            if(d > b) { // d > b and b > c and b > a
                if(e > b) { // e > b and d > b and b > c and b > a
                    return b;
                } else { // b > e and d > b > e and b > c and b > a
                    if(e > c) { // d > b > e > c and b > a
                        if(c > a) { // d > b > e > c > a
                            return e;
                        } else { // a > c and d > b > e > c and b > a > c
                            if(a > e) { // d > b > a > e > c
                                return a;
                            } else { // e > a and d > b > e > a > c
                                return e;
                            }
                        }
                    } else { // c > e and d > b > c > e and d > b > a
                        if(e > a) { // d > b > c > e > a
                            return c;
                        } else { // a > e and d > b > c > e and d > b > a > e
                            if(c > a) { // d > b > c > a > e
                                return c;
                            } else { // a > c and d > b > a > e
                                return a;
                            }
                        }
                    }
                }
            } else { // b > d and b > c and b > a
                if(c > d) { // b > c > d and b > a
                    if(c > a) { // b > c > d and b > c > a
                        if(e > c) { // e > c and b > c > d and b > c > a
                            return c;
                        } else { // c > e and b > c > d and b > c > a
                            if(a > d) { // b > c > a > d and c > e
                                if(a > e) { // b > c > a > e and b > c > a > d
                                    return a;
                                } else { // e > a and b > c > e > a > d
                                    return e;
                                }
                            } else { // d > a and c > e and b > c > d > a
                                if(e > d) { // b > c > e > d > a
                                    return e;
                                } else { // d > e and b > c > d > a and b > c > d > e
                                    return d;
                                }
                            }
                        }
                    } else { // a > c and b > a > c > d
                        if(d > e) { // b > a > c > d > e
                            return c;
                        } else { // e > d and b > a > c > d
                            if(c > e) { // b > a > c > e > d
                                return c;
                            } else { // e > c and e > d and b > a > c > d
                                if(a > e) { // b > a > e > c > d
                                    return e;
                                } else { // e > a and b > a > c > d and e > a > c > d
                                    return a;
                                }
                            }
                        }
                    }
                } else { // d > c and b > a and b > d > c
                    if(a > d) { // b > a > d > c
                        if(c > e) {  // b > a > d > c > e
                            return d;
                        } else { // e > c and b > a > d > c
                            if(e > d) { // e > d > c and b > a > d > c 
                                if(a > e) { // b > a > e > d > c
                                    return e;
                                } else { // e > a and e > a > d > c
                                    return a;
                                }
                            } else { // d > e and b > a > d > e > c
                                return d;
                            }
                        } 
                    } else { // d > a and b > a and b > d > c
                        if(e > b) { // d > a and e > b > a and e > b > d > c
                            if(c > a) { // e > b > d > c > a
                                return d;
                            } else { // a > c and d > a and e > b > a > c
                                if(b > d) { // e > b > d > a > c
                                    return d;
                                } else { // d > b and e > b > a > c
                                    return b;
                                }
                            }
                        } else { // b > e and b > d > a and b > d > c
                            if(c > e) { // b > d > a and b > d > c > e
                                if(c > a) { // b > d > c > e and b > d > c > a
                                    return c;
                                } else { // a > c and b > d > a > c > e
                                    return a;
                                }
                            } else { // e > c and b > e and b > d > a and b > d > c 
                                if(e > d) { // b > e > d > a and b > e > d > c 
                                    return d;
                                } else { // d > e and b > d > a and b > d > e > c
                                    if(a > e) { // b > d > a > e > c 
                                        return a;
                                    } else { // e > a and b > d > e > a and b > d > e > c
                                        return e;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

template<class T, class Compare>
inline T findMedian5(T a, T b, T c, T d, T e, Compare comp) {
    if(comp(b,a)) { // a > b
        if(comp(c,a)) { // a > c
            if(comp(d,a)) { // a > d
                if(comp(e,a)) { // a, ...
                    if(comp(c,b)) {
                        if(comp(d,b)) {
                            if(comp(e,b)) { // a, b, ...
                                if(comp(d,c)) {
                                    if(comp(e,c)) { // a, b, c, ...
                                        return c;
                                    } else { // a, b, e, ...
                                        return e;
                                    }
                                } else { // d > c
                                    if(comp(e,d)) { // a, b, d, ...
                                        return d;
                                    } else { //  e > d; a, b, e, ...
                                        return e;
                                    }
                                }
                            } else { // e > b > d and e > b > c; a, e, b, ...
                                return b;
                            }
                        } else { // d > b > c;
                            if(comp(e,b)) { // d > b > e and d > b > c; a, d, b, ...
                                return b;
                            } else { // e > b > c and d > b > c;
                                if(comp(e,d)) { // d > e > b > c; a, d, e, b, c
                                    return e;
                                } else { // e > d; e > d > b > c; a, e, d, b, c
                                    return d;
                                }
                            }
                        }
                    } else { // c > b
                        if(comp(d,c)) {
                            if(comp(e,c)) { // a, c, ...
                                if(comp(d,b)) {
                                    if(comp(e,b)) { // a, c, b, ...
                                        return b;
                                    } else { // e > b > d; a, c, e, b, d
                                        return e;
                                    }
                                } else { // d > b
                                    if(comp(e,d)) { // a, c, d, ...
                                        return d;
                                    } else { // e > d > b; a, c, e, d, b
                                        return e;
                                    }
                                }
                            } else { // e > c > b and e > c > d; a, e, c, ...
                                return c; 
                            }
                        } else { // d > c > b
                            if(comp(e,c)) { // d > c > b and d > c > e; a, d, c, ...
                                return c;
                            } else { // e > c > b 
                                if(comp(e,d)) { // d > e > c > b; a, d, e, c, b
                                    return e;
                                } else { // e > d > c > b; a, e, d, c, b
                                    return d;
                                }
                            }
                        }
                    }
                } else { // e > a > b and e > a > c and e > a > d; e, a, ...
                    if(comp(c,b)) { // b > c and e > a > b > c
                        if(comp(d,b)) { // b > d and e > a > b > c and e > a > b > d; e, a, b, ...
                            return b;
                        } else { // d > b and e > a > b > c and e > a > d > b > c; e, a, d, b, c
                            return d;
                        }
                    } else { // c > b and e > a > c > b and e > a > d;
                        if(comp(d,b)) { // b > d and e > a > c > b > d; e, a, c, b, d
                            return c;
                        } else { // d > b and e > a > c > b 
                            if(comp(d,c)) { // e > a > c > d > b ; e, a, c, d, b
                                return c;
                            } else { // d > c and e > a > d > c > b; e, a, d, c, b 
                                return d;
                            }
                        }
                    }
                }
            } else { // d > a and d > a > b and d > a > c
                if(comp(e,a)) { // d > a > e and d > a > b and d > a > c; d, a, ...
                    if(comp(b,c)) { // d > a > c > b and d > a > e
                        if(comp(e,c)) { // d > a > c > b and d > a > c > e; d, a, c, ...
                            return c;
                        } else { // e > c and d > a > e > c > b; d, a, e, c, b
                            return e;
                        }
                    } else { // b > c and d > a > b > c
                        if(comp(e,b)) { // d > a > b > c and d > a > b > e; d, a, b, ...
                            return b;
                        } else { // e > b and d > a > e > b > c; d, a, e, b, c
                            return e;
                        }
                    }
                } else { // e > a and d > a and a > b and a > c
                    return a;
                }
            }
        } else { // c > a > b
            if(comp(d,b)) { // c > a > b > d
                if(comp(e,b)) { // c > a > b > d and c > a > b > e; c, a, b, ...
                    return b;
                } else { // e > b and c > a > b > d
                    if(comp(e,a)) {  // a > e and c > a > e > b > d; c, a, e, b, d
                        return e;
                    } else { // e > a and e > a > b > d and c > a > b > d
                        return a;
                    }
                }
            } else { // d > b and c > a > b
                if(comp(a,d)) { // c > a and d > a and a > b 
                    if(comp(e,a)) { // c > a and d > a and a > b and a > e
                        return a;
                    } else { // e > a and c > a and and d > a > b
                        if(comp(d,c)) { // c > d > a > b
                            if(comp(e,d)) { // c > d > e > a > b
                                return e;
                            } else { // e > d and d > a > b and e > d and c > d
                                return d;
                            }
                        } else { // d > c and d > c > a > b
                            if(comp(d,e)) { // e > d > c > a > b
                                return c;
                            } else { // d > e and d > c > a > b
                                if(comp(e,c)) { // d > c > e > a > b
                                    return e;
                                } else { // e > c and d > e > c > a > b
                                    return c;
                                }
                            }
                        }
                    }
                } else { // a > d and c > a > d > b
                    if(comp(c,e)) { // e > c > a > d > b
                        return a;
                    } else { // c > e and c > a > d > b
                        if(comp(a,e)) { // c > e > a > d > b
                            return a;
                        } else { // a > e and c > a > d > b and c > a > e; c, a, ...
                            if(comp(d,e)) { // c > a > e > d > b
                                return e;
                            } else { // d > e and d > b and c > a > d
                                return d;
                            }
                        }
                    }
                }
            }
        }
    } else { // b > a
        if(comp(b,c)) { // c > b > a 
            if(comp(c,d)) { // d > c > b > a
                if(comp(d,e)) { // e > d > c > b > a
                    return c;
                } else { // d > e and d > c > b > a
                    if(comp(e,c)) { // d > c > b > a and c > e 
                        if(comp(b,e)) { // d > c > e > b > a
                            return e;
                        } else { // b > e and d > c > b > a and c > e
                            return b;
                        }
                    } else { // e > c and d > c > b > a
                        return c;
                    }
                }
            } else { // c > d and c > b > a
                if(comp(d,a)) { // c > b > a > d
                    if(comp(e,d)) { // c > b > a > d > e
                        return a;
                        //} else { // e > d and c > b > a > d
                        //    if(comp(c,e)) { // e > c > b > a > d
                        //        return b;
                        //    } else { // c > e and e > d and c > b > a > d
                        //        if(comp(b,e)) { // c > e and e > b and b > a > d
                        //            return b;
                        //        } else { // b > e and c > b > e > d and c > b > a > d
                        //            if(comp(e,a)) { // c > b > a > e > d
                        //                return a;
                        //            } else { // e > a and c > b > e > a > d
                        //                return e;
                        //            }
                        //        }
                        //    }
                } else { // e > d and c > b > a > d
                    if(comp(e,b)) // b > e > d and c > b > a > d
                        if(comp(e,a)) { //  c > b > a > e > d
                            return a;
                        } else { // e > a and c > b > e > a > d
                            return e;
                        }
                        else { // e > b and c > b > a > d
                            return b;
                        }
                }
                } else { // d > a and c > b > a and c > d > a
                    if(comp(d,b)) { // c > b > d > a
                        if(comp(e,d)) { // c > b > d > a and d > e
                            return d;
                        } else { // e > d and c > b > d > a
                            if(comp(e,b)) { // c > b > e > d > a
                                return  e;
                            } else { // e > b and c > b > d > a
                                return b;
                            }
                        }
                    } else { // d > b and c > d > b > a
                        if(comp(c,e)) { // e > c > d > b > a
                            return d;
                        } else { // c > e and c > d > b > a
                            if(comp(e,b)) { // c > d > b > e and c > d > b > a
                                return b;
                            } else { // e > b and c > d > b > a
                                if(comp(e,d)) { // c > d > e > b > a
                                    return e;
                                } else { // e > d and c > d > b > a
                                    return d;
                                }
                            }
                        }
                    }
                }
            }
        } else { // b > c and b > a
            if(comp(b,d)) { // d > b and b > c and b > a
                if(comp(b,e)) { // e > b and d > b and b > c and b > a
                    return b;
                } else { // b > e and d > b > e and b > c and b > a
                    if(comp(c,e)) { // d > b > e > c and b > a
                        if(comp(a,c)) { // d > b > e > c > a
                            return e;
                        } else { // a > c and d > b > e > c and b > a > c
                            if(comp(e,a)) { // d > b > a > e > c
                                return a;
                            } else { // e > a and d > b > e > a > c
                                return e;
                            }
                        }
                    } else { // c > e and d > b > c > e and d > b > a
                        if(comp(a,e)) { // d > b > c > e > a
                            return c;
                        } else { // a > e and d > b > c > e and d > b > a > e
                            if(comp(a,c)) { // d > b > c > a > e
                                return c;
                            } else { // a > c and d > b > a > e
                                return a;
                            }
                        }
                    }
                }
            } else { // b > d and b > c and b > a
                if(comp(d,c)) { // b > c > d and b > a
                    if(comp(a,c)) { // b > c > d and b > c > a
                        if(comp(c,e)) { // e > c and b > c > d and b > c > a
                            return c;
                        } else { // c > e and b > c > d and b > c > a
                            if(comp(d,a)) { // b > c > a > d and c > e
                                if(comp(e,a)) { // b > c > a > e and b > c > a > d
                                    return a;
                                } else { // e > a and b > c > e > a > d
                                    return e;
                                }
                            } else { // d > a and c > e and b > c > d > a
                                if(comp(d,e)) { // b > c > e > d > a
                                    return e;
                                } else { // d > e and b > c > d > a and b > c > d > e
                                    return d;
                                }
                            }
                        }
                    } else { // a > c and b > a > c > d
                        if(comp(e,d)) { // b > a > c > d > e
                            return c;
                        } else { // e > d and b > a > c > d
                            if(comp(e,c)) { // b > a > c > e > d
                                return c;
                            } else { // e > c and e > d and b > a > c > d
                                if(comp(e,a)) { // b > a > e > c > d
                                    return e;
                                } else { // e > a and b > a > c > d and e > a > c > d
                                    return a;
                                }
                            }
                        }
                    }
                } else { // d > c and b > a and b > d > c
                    if(comp(d,a)) { // b > a > d > c
                        if(comp(e,c)) {  // b > a > d > c > e
                            return d;
                        } else { // e > c and b > a > d > c
                            if(comp(d,e)) { // e > d > c and b > a > d > c 
                                if(comp(e,a)) { // b > a > e > d > c
                                    return e;
                                } else { // e > a and e > a > d > c
                                    return a;
                                }
                            } else { // d > e and b > a > d > e > c
                                return d;
                            }
                        } 
                    } else { // d > a and b > a and b > d > c
                        if(comp(b,e)) { // d > a and e > b > a and e > b > d > c
                            if(comp(a,c)) { // e > b > d > c > a
                                return d;
                            } else { // a > c and d > a and e > b > a > c
                                if(comp(d,b)) { // e > b > d > a > c
                                    return d;
                                } else { // d > b and e > b > a > c
                                    return b;
                                }
                            }
                        } else { // b > e and b > d > a and b > d > c
                            if(comp(e,c)) { // b > d > a and b > d > c > e
                                if(comp(a,c)) { // b > d > c > e and b > d > c > a
                                    return c;
                                } else { // a > c and b > d > a > c > e
                                    return a;
                                }
                            } else { // e > c and b > e and b > d > a and b > d > c 
                                if(comp(d,e)) { // b > e > d > a and b > e > d > c 
                                    return d;
                                } else { // d > e and b > d > a and b > d > e > c
                                    if(comp(e,a)) { // b > d > a > e > c 
                                        return a;
                                    } else { // e > a and b > d > e > a and b > d > e > c
                                        return e;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

template<class T, class Compare>
inline uint64 findMedianIndex5(T a, T b, T c, T d, T e, Compare comp) {
    if(comp(b,a)) { // a > b
        if(comp(c,a)) { // a > c
            if(comp(d,a)) { // a > d
                if(comp(e,a)) { // a, ...
                    if(comp(c,b)) {
                        if(comp(d,b)) {
                            if(comp(e,b)) { // a, b, ...
                                if(comp(d,c)) {
                                    if(comp(e,c)) { // a, b, c, ...
                                         return 2;
                                    } else { // a, b, e, ...
                                         return 4;
                                    }
                                } else { // d > c
                                    if(comp(e,d)) { // a, b, d, ...
                                         return 3;
                                    } else { //  e > d; a, b, e, ...
                                         return 4;
                                    }
                                }
                            } else { // e > b > d and e > b > c; a, e, b, ...
                                 return 1;
                            }
                        } else { // d > b > c;
                            if(comp(e,b)) { // d > b > e and d > b > c; a, d, b, ...
                                 return 1;
                            } else { // e > b > c and d > b > c;
                                if(comp(e,d)) { // d > e > b > c; a, d, e, b, c
                                     return 4;
                                } else { // e > d; e > d > b > c; a, e, d, b, c
                                     return 3;
                                }
                            }
                        }
                    } else { // c > b
                        if(comp(d,c)) {
                            if(comp(e,c)) { // a, c, ...
                                if(comp(d,b)) {
                                    if(comp(e,b)) { // a, c, b, ...
                                         return 1;
                                    } else { // e > b > d; a, c, e, b, d
                                         return 4;
                                    }
                                } else { // d > b
                                    if(comp(e,d)) { // a, c, d, ...
                                         return 3;
                                    } else { // e > d > b; a, c, e, d, b
                                         return 4;
                                    }
                                }
                            } else { // e > c > b and e > c > d; a, e, c, ...
                                 return 2; 
                            }
                        } else { // d > c > b
                            if(comp(e,c)) { // d > c > b and d > c > e; a, d, c, ...
                                 return 2;
                            } else { // e > c > b 
                                if(comp(e,d)) { // d > e > c > b; a, d, e, c, b
                                     return 4;
                                } else { // e > d > c > b; a, e, d, c, b
                                     return 3;
                                }
                            }
                        }
                    }
                } else { // e > a > b and e > a > c and e > a > d; e, a, ...
                    if(comp(c,b)) { // b > c and e > a > b > c
                        if(comp(d,b)) { // b > d and e > a > b > c and e > a > b > d; e, a, b, ...
                             return 1;
                        } else { // d > b and e > a > b > c and e > a > d > b > c; e, a, d, b, c
                             return 3;
                        }
                    } else { // c > b and e > a > c > b and e > a > d;
                        if(comp(d,b)) { // b > d and e > a > c > b > d; e, a, c, b, d
                             return 2;
                        } else { // d > b and e > a > c > b 
                            if(comp(d,c)) { // e > a > c > d > b ; e, a, c, d, b
                                 return 2;
                            } else { // d > c and e > a > d > c > b; e, a, d, c, b 
                                 return 3;
                            }
                        }
                    }
                }
            } else { // d > a and d > a > b and d > a > c
                if(comp(e,a)) { // d > a > e and d > a > b and d > a > c; d, a, ...
                    if(comp(b,c)) { // d > a > c > b and d > a > e
                        if(comp(e,c)) { // d > a > c > b and d > a > c > e; d, a, c, ...
                             return 2;
                        } else { // e > c and d > a > e > c > b; d, a, e, c, b
                             return 4;
                        }
                    } else { // b > c and d > a > b > c
                        if(comp(e,b)) { // d > a > b > c and d > a > b > e; d, a, b, ...
                             return 1;
                        } else { // e > b and d > a > e > b > c; d, a, e, b, c
                             return 4;
                        }
                    }
                } else { // e > a and d > a and a > b and a > c
                     return 0;
                }
            }
        } else { // c > a > b
            if(comp(d,b)) { // c > a > b > d
                if(comp(e,b)) { // c > a > b > d and c > a > b > e; c, a, b, ...
                     return 1;
                } else { // e > b and c > a > b > d
                    if(comp(e,a)) {  // a > e and c > a > e > b > d; c, a, e, b, d
                         return 4;
                    } else { // e > a and e > a > b > d and c > a > b > d
                         return 0;
                    }
                }
            } else { // d > b and c > a > b
                if(comp(a,d)) { // c > a and d > a and a > b 
                    if(comp(e,a)) { // c > a and d > a and a > b and a > e
                         return 0;
                    } else { // e > a and c > a and and d > a > b
                        if(comp(d,c)) { // c > d > a > b
                            if(comp(e,d)) { // c > d > e > a > b
                                 return 4;
                            } else { // e > d and d > a > b and e > d and c > d
                                 return 3;
                            }
                        } else { // d > c and d > c > a > b
                            if(comp(d,e)) { // e > d > c > a > b
                                 return 2;
                            } else { // d > e and d > c > a > b
                                if(comp(e,c)) { // d > c > e > a > b
                                     return 4;
                                } else { // e > c and d > e > c > a > b
                                     return 2;
                                }
                            }
                        }
                    }
                } else { // a > d and c > a > d > b
                    if(comp(c,e)) { // e > c > a > d > b
                         return 0;
                    } else { // c > e and c > a > d > b
                        if(comp(a,e)) { // c > e > a > d > b
                             return 0;
                        } else { // a > e and c > a > d > b and c > a > e; c, a, ...
                            if(comp(d,e)) { // c > a > e > d > b
                                 return 4;
                            } else { // d > e and d > b and c > a > d
                                 return 3;
                            }
                        }
                    }
                }
            }
        }
    } else { // b > a
        if(comp(b,c)) { // c > b > a 
            if(comp(c,d)) { // d > c > b > a
                if(comp(d,e)) { // e > d > c > b > a
                     return 2;
                } else { // d > e and d > c > b > a
                    if(comp(e,c)) { // d > c > b > a and c > e 
                        if(comp(b,e)) { // d > c > e > b > a
                             return 4;
                        } else { // b > e and d > c > b > a and c > e
                             return 1;
                        }
                    } else { // e > c and d > c > b > a
                         return 2;
                    }
                }
            } else { // c > d and c > b > a
                if(comp(d,a)) { // c > b > a > d
                    if(comp(e,d)) { // c > b > a > d > e
                         return 0;
                        //} else { // e > d and c > b > a > d
                        //    if(comp(c,e)) { // e > c > b > a > d
                        //         return 1;
                        //    } else { // c > e and e > d and c > b > a > d
                        //        if(comp(b,e)) { // c > e and e > b and b > a > d
                        //             return 1;
                        //        } else { // b > e and c > b > e > d and c > b > a > d
                        //            if(comp(e,a)) { // c > b > a > e > d
                        //                 return 0;
                        //            } else { // e > a and c > b > e > a > d
                        //                 return 4;
                        //            }
                        //        }
                        //    }
                } else { // e > d and c > b > a > d
                    if(comp(e,b)) // b > e > d and c > b > a > d
                        if(comp(e,a)) { //  c > b > a > e > d
                             return 0;
                        } else { // e > a and c > b > e > a > d
                             return 4;
                        }
                        else { // e > b and c > b > a > d
                             return 1;
                        }
                }
                } else { // d > a and c > b > a and c > d > a
                    if(comp(d,b)) { // c > b > d > a
                        if(comp(e,d)) { // c > b > d > a and d > e
                             return 3;
                        } else { // e > d and c > b > d > a
                            if(comp(e,b)) { // c > b > e > d > a
                                return  e;
                            } else { // e > b and c > b > d > a
                                 return 1;
                            }
                        }
                    } else { // d > b and c > d > b > a
                        if(comp(c,e)) { // e > c > d > b > a
                             return 3;
                        } else { // c > e and c > d > b > a
                            if(comp(e,b)) { // c > d > b > e and c > d > b > a
                                 return 1;
                            } else { // e > b and c > d > b > a
                                if(comp(e,d)) { // c > d > e > b > a
                                     return 4;
                                } else { // e > d and c > d > b > a
                                     return 3;
                                }
                            }
                        }
                    }
                }
            }
        } else { // b > c and b > a
            if(comp(b,d)) { // d > b and b > c and b > a
                if(comp(b,e)) { // e > b and d > b and b > c and b > a
                     return 1;
                } else { // b > e and d > b > e and b > c and b > a
                    if(comp(c,e)) { // d > b > e > c and b > a
                        if(comp(a,c)) { // d > b > e > c > a
                             return 4;
                        } else { // a > c and d > b > e > c and b > a > c
                            if(comp(e,a)) { // d > b > a > e > c
                                 return 0;
                            } else { // e > a and d > b > e > a > c
                                 return 4;
                            }
                        }
                    } else { // c > e and d > b > c > e and d > b > a
                        if(comp(a,e)) { // d > b > c > e > a
                             return 2;
                        } else { // a > e and d > b > c > e and d > b > a > e
                            if(comp(a,c)) { // d > b > c > a > e
                                 return 2;
                            } else { // a > c and d > b > a > e
                                 return 0;
                            }
                        }
                    }
                }
            } else { // b > d and b > c and b > a
                if(comp(d,c)) { // b > c > d and b > a
                    if(comp(a,c)) { // b > c > d and b > c > a
                        if(comp(c,e)) { // e > c and b > c > d and b > c > a
                             return 2;
                        } else { // c > e and b > c > d and b > c > a
                            if(comp(d,a)) { // b > c > a > d and c > e
                                if(comp(e,a)) { // b > c > a > e and b > c > a > d
                                     return 0;
                                } else { // e > a and b > c > e > a > d
                                     return 4;
                                }
                            } else { // d > a and c > e and b > c > d > a
                                if(comp(d,e)) { // b > c > e > d > a
                                     return 4;
                                } else { // d > e and b > c > d > a and b > c > d > e
                                     return 3;
                                }
                            }
                        }
                    } else { // a > c and b > a > c > d
                        if(comp(e,d)) { // b > a > c > d > e
                             return 2;
                        } else { // e > d and b > a > c > d
                            if(comp(e,c)) { // b > a > c > e > d
                                 return 2;
                            } else { // e > c and e > d and b > a > c > d
                                if(comp(e,a)) { // b > a > e > c > d
                                     return 4;
                                } else { // e > a and b > a > c > d and e > a > c > d
                                     return 0;
                                }
                            }
                        }
                    }
                } else { // d > c and b > a and b > d > c
                    if(comp(d,a)) { // b > a > d > c
                        if(comp(e,c)) {  // b > a > d > c > e
                             return 3;
                        } else { // e > c and b > a > d > c
                            if(comp(d,e)) { // e > d > c and b > a > d > c 
                                if(comp(e,a)) { // b > a > e > d > c
                                     return 4;
                                } else { // e > a and e > a > d > c
                                     return 0;
                                }
                            } else { // d > e and b > a > d > e > c
                                 return 3;
                            }
                        } 
                    } else { // d > a and b > a and b > d > c
                        if(comp(b,e)) { // d > a and e > b > a and e > b > d > c
                            if(comp(a,c)) { // e > b > d > c > a
                                 return 3;
                            } else { // a > c and d > a and e > b > a > c
                                if(comp(d,b)) { // e > b > d > a > c
                                     return 3;
                                } else { // d > b and e > b > a > c
                                     return 1;
                                }
                            }
                        } else { // b > e and b > d > a and b > d > c
                            if(comp(e,c)) { // b > d > a and b > d > c > e
                                if(comp(a,c)) { // b > d > c > e and b > d > c > a
                                     return 2;
                                } else { // a > c and b > d > a > c > e
                                     return 0;
                                }
                            } else { // e > c and b > e and b > d > a and b > d > c 
                                if(comp(d,e)) { // b > e > d > a and b > e > d > c 
                                     return 3;
                                } else { // d > e and b > d > a and b > d > e > c
                                    if(comp(e,a)) { // b > d > a > e > c 
                                         return 0;
                                    } else { // e > a and b > d > e > a and b > d > e > c
                                         return 4;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

#endif
